package com.hz.example.lib;

import com.udojava.evalex.Expression;
import org.junit.Test;

import java.math.BigDecimal;

/**
 * @author hezhao created on 2019/12/14 16:53
 */
public class TestUdoJava {

    @Test
    public void testCalc() {
        String condition = "0<w<=10";
        String express = "(w + 1) * 2";
        BigDecimal num = new BigDecimal("5");
        String w = "w";
        if (flag(condition, w, num)) {
            BigDecimal result = eval(express, w, num);
            System.out.println(result);
        }
    }


    /** 计算公式
     * @param express     计算公式
     * @param billingType 类型
     * @param value       数值
     * @remark 128:计算精度位数,不限于小数点后
     * @return
     */
    public static BigDecimal eval(String express, String billingType, BigDecimal value) {
        try {
            return new Expression(express)
                    .setPrecision(128)
                    .with(billingType, value)
                    .eval();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 条件表达式判断
     *
     * @param express   条件表达式
     * @param value     数值
     * @return
     */
    public static boolean flag(String express, String billingType, BigDecimal value) {
        // 表达式返回1表示true，0表示false
        BigDecimal eval = eval(express, billingType, value);
        if (eval == null) {
            return false;
        }
        return eval.compareTo(BigDecimal.ONE) == 0;
    }

}
